#include "room.hpp"
#include "session.hpp"
#include "matcher.hpp"
#include "server.hpp"

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PWD "Wzw@1024."
#define DBNAME "gobang"

void mysql_test()
{
    // 1. 初始化数据库
    MYSQL *mysql = mysql_util::mysql_create(HOST, USER, PWD, DBNAME, PORT);

    // 2. 执行语句
    const char *sql = "insert stu values(null, '王五', 18, 96, 99, 94.5);";
    bool ret = mysql_util::mysql_exec(mysql, sql);
    if (ret == false)
        return;

    // // 6. 如是查询语句，则要保存到本地
    // MYSQL_RES* res = mysql_store_result(mysql);
    // if(res == NULL)
    // {
    //     ERR_LOG("%s\n", sql);
    //     ERR_LOG("musql store fialed : %s", mysql_error(mysql));
    //     mysql_close(mysql);
    //     return -1;
    // }

    // // 7. 获取结果集中的结果条数
    // uint64_t rows = mysql_num_rows(res);
    // unsigned int cols = mysql_num_fields(res);

    // // 8. 遍历保存到本地的结果集
    // for(int i = 0; i < rows; ++i)
    // {
    //     MYSQL_ROW row = mysql_fetch_row(res);
    //     for(int j = 0; j < cols; ++j)
    //     {
    //         printf("%s\t", row[j]);
    //     }
    //     printf("\n");
    // }

    // // 9. 释放结果集
    // mysql_free_result(res);

    // 3. 销毁
    mysql_util::mysql_destory(mysql);
}

void json_test()
{
    // 1. 将需要进行序列化的数据，存储在Json::Value对象中
    Json::Value root;
    root["姓名"] = "李华";
    root["年龄"] = 18;
    /* 认为uroot["分数"]只是一个普通的数据，若使用"="来为数组赋值，则会覆盖前面的数据。数组属性的数据需要使用append */
    root["成绩"].append(98);
    root["成绩"].append(95);
    root["成绩"].append(98.5);

    std::string in;
    json_util::serialize(root, &in);

    DBG_LOG("%s", in.c_str());

    Json::Value value;
    json_util::unserialize(in, &value);
    // 5. 逐个元素去访问Json::Value中的数据
    std::cout << "姓名：" << value["姓名"].asString() << std::endl;
    std::cout << "年龄：" << value["年龄"].asInt() << std::endl;
    int num = value["成绩"].size();
    std::cout << "成绩：";
    for (int i = 0; i < num; ++i)
    {
        std::cout << value["成绩"][i].asDouble() << ", ";
    }
    std::cout << std::endl;
}

void string_test()
{
    std::string str = ",,**,123,456,,,,78*9,,,";
    std::vector<std::string> array;
    string_util::split(str, ",", array);

    for (auto s : array)
    {
        DBG_LOG("%s", s.c_str());
    }
}

void file_test()
{
    std::string filename = "./makefile";
    std::string body;
    file_util::read(filename, &body);

    DBG_LOG("%s", body.c_str());
}

void db_test()
{
    user_table ut(HOST, USER, PWD, DBNAME, PORT);
    Json::Value user;
    user["username"] = "lihua";
    // user["password"] = "1234567";
    // ut.add(user);
    bool ret = ut.login(user);
    if (ret == false)
    {
        DBG_LOG("login failed!");
    }

    // bool ret = ut.select_by_name("lihua", user);
    // bool ret = ut.select_by_id(2, user);
    // std::string body;
    // json_util::serialize(user, &body);
    // DBG_LOG("%s", body.c_str());
    // ut.win(1);
    // ut.lose(1);
}

void online_user_test()
{
    online_user ou;
    wsserver_t::connection_ptr conn;
    uint64_t uid = 2;
    ou.enter_hall(uid, conn);
    if (ou.is_in_hall(uid))
        DBG_LOG("in game hall");
    else
        DBG_LOG("not in game hall");

    ou.exit_hall(uid);
    if (ou.is_in_hall(uid))
        DBG_LOG("in game hall");
    else
        DBG_LOG("not in game hall");
}

void room_test()
{
    user_table ut(HOST, USER, PWD, DBNAME, PORT);
    online_user olu;
    room_manager rm(&ut, &olu);
    room_ptr rp = rm.create_room(10, 20);
}

void session_test()
{
}

void match_test()
{
    // match_queue<uint64_t> mq;
    user_table ut(HOST, USER, PWD, DBNAME, PORT);
    online_user olu;
    room_manager rm(&ut, &olu);
    match_manage matcher(&rm, &ut, &olu);
}

void server_test()
{
    // user_table ut(HOST, USER, PWD, DBNAME, PORT);
    // online_user olu;
    // room_manager rm(&ut, &olu);
    // match_manage matcher(&rm, &ut, &olu);
    gobang_server gsvr(HOST, USER, PWD, DBNAME, PORT);

    gsvr.start(9000);
}

int main()
{
    // LOG("%s-%d", "hello", 666);// fprintf(stdout, "[%s %s:%d] " format, buf, __FILE__, __LINE__, __VA_ARGS__);
    // LOG("hello");// fprintf(stdout, "[%s %s:%d] " format, buf, __FILE__, __LINE__, ##__VA_ARGS__);
    // INF_LOG("hello");
    // DBG_LOG("world");
    // ERR_LOG("!!!");

    // mysql_test();
    // json_test();
    // string_test();
    // file_test();
    // db_test();
    // online_user_test();
    // room_test();
    // session_test();
    // match_test();
    // server_test();

    // 初始化服务器
    gobang_server gsvr(HOST, USER, PWD, DBNAME, PORT);
    // 启动服务器
    gsvr.start(9000);

    return 0;
}